package guoanmaker.provider.business.service;

import java.io.IOException;
import java.math.BigDecimal;
import java.util.Map;

import org.springframework.web.multipart.MultipartFile;

import guoanmaker.provider.business.model.PersonalFinanceProject;
import guoanmaker.provider.business.model.ReturnResult;
import guoanmaker.provider.business.modelnobind.PersonalFinanceProjectForAPPVisitor;
import guoanmaker.provider.business.modelnobind.PersonalFinanceProjectForPCVisitor;
import guoanmaker.provider.business.modelnobind.PersonalFinanceProjectPartOne;
import guoanmaker.provider.business.modelnobind.PersonalFinanceProjectPartTwo;

/**
 * 金融服务Service接口
 * 2017-12-19 
 * @author ws
 */

public interface PersonalFinanceProjectServiceInterface {

	/**
	 * 分页查询PC端个人中心已发布金融服务VO
	 * 
	 * @param userId
	 * 			用户id，为发布项目者id即登录网站的用户id
	 * @param page
	 * 			当前页数
	 * @param size
	 * 			每页可显示的VO数量
	 * @return
	 */
	Map<String, Object> findPersonalFinanceProjectForPCPerson(String userId, Integer page, Integer size);
	
	/**
	 * 保存新建金融服务项目或修改金融服务项目的商业企划书部分
	 *      新增或修改后的项目，状态皆为“待发布”，并将审核通过时间、项目重要级别置为空
	 * @param personalFinanceProject
	 * 			金融服务对象
	 * @return
	 */
	ReturnResult saveOrUpdatePersonalFinanceProjectPartOne(PersonalFinanceProject personalFinanceProject) throws IllegalArgumentException, IllegalAccessException, ClassNotFoundException;
	
	/**
	 * 修改金融服务项目的融资信息部分
	 * 		修改后的项目，状态为“待发布”，并将审核通过时间、项目重要级别置空
	 * @param personalFinanceProject
	 * 			金融服务对象,该对象必有id值，否则修改失败
	 * @param flag1
	 * 			0:该金融项目没有专利技术    1:该金融项目有专利技术
	 * @param flag2
	 * 			0:该金融项目没有融资经历    1:该金融项目有融资经历
	 * @param flag3
	 * 			0:该金融项目没有创业赛事奖项    1:该金融项目有创业赛事奖项
	 * @return
	 */
	ReturnResult updatePersonalFinanceProjectPartTwo(PersonalFinanceProject personalFinanceProject, Integer flag1, Integer flag2, Integer flag3) throws IllegalArgumentException, IllegalAccessException, ClassNotFoundException;
	
	/**
	 * 项目状态转换
	 * @param projectId
	 * 			金融服务项目id
	 * @param operation
	 * 			操作   "submit"发布、"offLine"下线
	 * @return
	 */
	ReturnResult convertStatus(String projectId, String operation);
	
	/**
	 * 根据金融项目id查询PC端游客展示的金融项目VO
	 * @param projectId
	 * 			金融项目id
	 * @return
	 */
	PersonalFinanceProjectForPCVisitor findPersonalFinanceProjectForPCVisitorById(String projectId);
	
	/**
	 * 分页查询游客浏览金融服务VO，金融服务必须是已通过项目.同时返回复合条件的金融服务项目数量
	 * @param industryField
	 * 			所属行业
	 * @param financingTargetBegin
	 * 			融资目标起始金额
	 * @param financingTargetEnd
	 * 			融资目标终止金额
	 * @param sortBy
	 * 			排序依赖     "toExamineTime"审核通过时间     "financingTarget"融资目标
	 * @param strategy
	 * 			排序规则     "DESC"降序排序    "ASC"升序排序
	 * @param page
	 * 			当前页数,从0开始
	 * @param size
	 * 			每页可显示数量
	 * @return
	 */
	Map<String, Object> findPersonalFinanceProjectForPCVisitor(String industryField, BigDecimal financingTargetBegin, BigDecimal financingTargetEnd, String sortBy, String strategy, Integer page, Integer size);
	
	/**
	 * 查询金融项目的商业企划书信息
	 * @param projectId
	 * 			金融服务项目id
	 * @return
	 */
	PersonalFinanceProjectPartOne findPersonalFinanceProjectPartOne(String projectId);
	
	/**
	 * 查询金融项目的融资信息
	 * @param projectId
	 * 			金融服务项目id
	 * @return
	 */
	PersonalFinanceProjectPartTwo findPersonalFinanceProjectPartTwo(String projectId);
	
	/**
	 * 查询金融项目详细信息、项目方名片即创始人信息
	 * @param projectId
	 * 			金融服务项目id
	 * @return
	 */
	Map<String, Object> findPersonalFinanceProjectDetails(String projectId);
	
	/**
	 * 分页查询APP端个人中心已发布金融服务VO,需符合传入状态,按审核通过时间排序
	 * @param userId
	 * 			用户id
	 * @param status
	 * 			金融服务项目状态  （0:已通过   1:已下线   2:已拒绝   3:待发布   4:待审核）
	 * @param page
	 * 			当前页数，从0开始
	 * @param size
	 * 			每页可显示数量
	 * @return
	 */
	Map<String, Object> findPersonalFinanceProjectForAPPPerson(String userId, Integer status, Integer page, Integer size);
	
	/**
	 * 根据金融项目id查询APP端游客展示的金融项目VO
	 * @param projectId
	 * 			金融项目id
	 * @return
	 */
	PersonalFinanceProjectForAPPVisitor findPersonalFinanceProjectForAPPVisitorById(String projectId);
	
	/**
	 * 分页查询APP端游客浏览金融服务VO
	 * @param page
	 * 			当前页数
	 * @param size
	 * 			每页可显示数量
	 * @return
	 */
	Map<String, Object> findPersonalFinanceProjectForAPPVisitor(Integer page, Integer size);
	
	/**
	 * 查询金融项目被拒绝原因
	 * @param projectId
	 * 			金融项目id
	 * @return
	 */
	ReturnResult findRefuseReason(String projectId);
	
	/**
	 * 上传金融服务项目图片,并返回url地址
	 * @param projectPhoto
	 * 			金融服务项目图片
	 * @return
	 */
	ReturnResult uploadPersonalFinanceProjectPhoto(MultipartFile projectPhoto) throws IOException;
	
	/**
	 * 上传金融服务项目企划书,并返回url地址
	 * @param prospectus
	 * 			金融服务项目企划书文件
	 * @return
	 */
	ReturnResult uploadPersonalFinanceProjectProspectus(MultipartFile prospectus) throws IOException;
	
	/**
	 * 上传金融服务项目合伙人头像,并返回url地址
	 * @param prospectus
	 * 			金融服务项目合伙人头像
	 * @return
	 */
	ReturnResult uploadPersonalFinanceProjectPartnerPhoto(MultipartFile photo) throws IOException;
	
	/*
	 * 判断传入的Object对象的域是否存在null
	 */
	boolean isFinished(Object obj) throws IllegalArgumentException, IllegalAccessException, ClassNotFoundException;
	
}

	
